package com.shujia.core

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD
import org.apache.spark.storage.StorageLevel

object Demo20Cache {
  def main(args: Array[String]): Unit = {

    val conf: SparkConf = new SparkConf()
    conf.setAppName("Demo20Cache")
    conf.setMaster("local")

    val sc: SparkContext = new SparkContext(conf)

    val stuRDD: RDD[String] = sc.textFile("spark/data/students.txt")

    val stuMapRDD: RDD[String] = stuRDD.map(line => {
      println("读取了文件")
      line
    })

    /**
     * 对多次使用的RDD进行缓存
     * 当数据量比较大，内存放不下，怎么办？
     * 选择合适的缓存策略，怎么选？ 尽可能将数据放入内存中
     * 1、内存充足 --> MEMORY_ONLY
     * 2、内存不够 --> MEMORY_AND_DISK_SER
     */
    //    stuMapRDD.cache() // 默认使用MEMORY_ONLY进行缓存
    // 如果需要使用其他的缓存策略 可以使用persist方法
    stuMapRDD.persist(StorageLevel.MEMORY_AND_DISK_SER)


    // 统计性别人数
    val genderRDD: RDD[(String, Int)] = stuMapRDD.map(line => (line.split(",")(3), 1))
    val genderCnt: RDD[(String, Int)] = genderRDD.reduceByKey(_ + _)
    genderCnt.foreach(println)

    // 统计班级人数
    val clazzRDD: RDD[(String, Int)] = stuMapRDD.map(line => (line.split(",")(4), 1))
    val clazzCnt: RDD[(String, Int)] = clazzRDD.reduceByKey(_ + _)
    clazzCnt.foreach(println)

    while (true) {

    }

    // 使用完记得释放缓存
    stuMapRDD.unpersist()

  }

}
